﻿#ifndef _SVS_TIME_H
#define _SVS_TIME_H


#include <Includes.h>
#include "DRV_EC600S.h"


#pragma pack(1)

#define DEFAULT_ZONE    8

/*
typedef struct
{
	U32 year;
	U32 month;
	U32 day;
	U32 week; // 0:invalid,1-7:周一-周日
	U32 hour;
	U32 min;
	U32 seconds;
	U32 ms;
} ST_TIME_PARA;
*/
typedef struct
{
    U16 sunrise;  // 日出时间，ByteH:时，ByteL：分
    U16 sunset;  //日落时间， ByteH:时，Byte：分
} ST_SUN_TIME_PARA;

typedef struct
{
	int riseH; /*日出h*/
	int riseM; /*日出m*/
	int riseS; /*日出s*/
	int setH; /*日落h*/
	int setM; /*日落m*/
	int setS; /*日落s*/
}ST_AST;

typedef struct
{
	U8 clkSrc;
}ST_CLKSRC;

typedef struct{
	T_MUTEX mutex;
	U32 updatePeriod;
}ST_UPDATE_PERIOD;

typedef enum{
    NBIOT_TSRC=0,
    GPS_TSRC,
    RTC_TSRC,
    UNKNOW_TSRC
}EN_TIME_SRC;

#define NO_RECV_TIME    0
#define RECV_TIME       1

typedef struct{
	T_MUTEX mutex;
    U8 src;
	U8 recvTime;
}ST_RECV_TIME;

typedef unsigned long    my_time_t;

#pragma pack()

#define CLKSRC_ID    0
#define RRT_ID   1
#define RSYN_ID  2
#define RTC_FAULT_ID    3
/*
#define LOCAL_CLK    0x01
#define GPS_CLK    	 0x02
#define NBIOT_CLK    0x04
*/
#define    GPS_CLK_BIT    0x01
#define    NBIOT_CLK_BIT  0x02
#define    RTC_CLK_BIT    0x04
//#define    DEFAULT_CLK_BIT    (NBIOT_CLK_BIT|RTC_CLK_BIT)
#define    DEFAULT_CLK_BIT    (NBIOT_CLK_BIT)

typedef enum{
    ALL_CLK=0,
    GPS_CLK=1,
    NBIOT_CLK=2,
    LOC_CLK=3,
    RTC_CLK=4,
    UNKNOW_CLK
}EN_CLK;
#define NBIOT_ATCLCK_NOTIME_TO    120000    /*two min*/
//#define NBIOT_ATCLCK_TO    7200000    /*two hour*/
#define NBIOT_ATCLCK_TO    0xFFFFFFFF
#if DEV_USED==DEV_BC28
#define WAIT_WRITE_RTC_TO     120000
#elif DEV_USED==DEV_EC600S
#define WAIT_WRITE_RTC_TO     300000
#endif
#define SYNC_RTC_TO           3600000
#define RSYN_FLAG    0x55A5A5A5
//extern static ST_TIME g_stTime;
extern U8 g_ucInitTime;

typedef struct
{
    U16 uwYear;                                    /*年份(如: 2013)*/
    U8  ucMon;                                     /*月份(1~12)*/
    U8  ucDay;                                     /*日期(1~31)*/
    U8  ucWDay;                                    /*星期几(1~7)*/
    U8  ucHour;                                    /*时(0~23)*/
    U8  ucMin;                                     /*分(0~59)*/
    U8  ucSec;                                     /*秒(0~59)*/
	U16 usMs;                                      /*毫秒(0~999)*/
}ST_OPPLE_TIME;

/**
  @brief 获取当前日期、时间 (2020-10-19 Liqi)
  @param dt 日期时间
  @retval 0:成功获取到，其他：无有效时间
  @note 该代码合并到含RTC功能的工程时需要注意实现方式
*/
int DateTimeGet(ST_TIME *dt);

/**
  @brief 日期时间对比 (2020-10-19 Liqi)
  @param dt_dst 目标日期时间
  @param dt_src 需要对比的日期时间
  @note 注意时区信息忽略
  @retval
    -1: dt_src早于dt_dst
    0 : 一样
    1 ：dt_src晚于dt_dst
*/
int DateTimeCmp(ST_TIME *dt_dst,ST_TIME *dt_src);

/**
  @brief 判断当前日期时间是否超过指定日期时间
  @param dt日期时间
  @retval -1：系统无有效日期时间，0：未超过，1：超过
*/
int isNowOutOfDateTime(ST_TIME *dt);

/**
 *******************************************************************************
 *@brief            获取设备本地GMT时间
 *@param            time 出参，当前时间
 *@return           .
 *******************************************************************************
 */
void TimeGet(ST_TIME* time);
U32 TimeGetRet(ST_TIME* time);
int TimeSetClockSrc(U8 ucClkSrc);
int TimeGetClockSrc(void);
U32 TimeGetClkSrcFromFlash(ST_CLKSRC *pstClkSrc);
U32 TimeSetClkSrcToFlash(ST_CLKSRC *pstClkSrc);
U32 TimeRead(unsigned char ucClkSrc, int*zone, ST_OPPLE_TIME * pstTimePara);
void TimeLoop(void);
int TimeInit(void);
int TimeFromNbiotClockEvent(void);
int TimeGetFromNbiotClockEvent(ST_TIME *time);
int TimeFromNbiotClock(void);
int TimeFromGpsClock(void);
int TimeGetFromGpsClock(ST_TIME *time);
/*手动直接设置UTC时间*/
int TimeSetCallback(U8 year, U8 month, U8 day, U8 hour, U8 min, U8 second, S8 zone);
/*手动直接设置GMT时间*/
int TimeSet(U8 year, U8 month, U8 day, U8 hour, U8 min, U8 second, S8 zone);
void TimerCallback(TimerHandle_t timer);
int TimeRecvTimeSet(U8 src, U8 hasRecv);
U8 timeRecvTimeGet(ST_RECV_TIME *pstRecvTime);
U8 set_zone(S8 zone);
U8 get_zone();
U32 TimeInitRtc(void);
U32 TimeSetRtcTime(ST_TIME *time,U8 ucIsExactTime);
U32 TimeGetRtcTime(ST_TIME *time, U8 *pucIsExactTime);
U32 TimeUpdateFromRtc(void);

#endif
